home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_asm / xonxoff / xonxoff.asm
Encoding:
Internet Message Format  |  1986-12-13  |  5.3 KB

  1. From: seismo!hao!hplabs!well!micropro!sagan!frank (Frank Whaley)
  2. Newsgroups: net.sources
  3. Subject: XON/XOFF Protocol Driver for IBMPC
  4. Date: 1 Oct 85 22:55:07 GMT
  5. Organization: MicroPro Int'l Corp., San Rafael, CA
  6. Keywords: XON/XOFF IBMPC
  7.  
  8. Following is MASM source for a program which installs an XON/XOFF
  9. protocol serial printer driver, attached to COM1:.  This code is
  10. completely useless to most people, but the price is right.
  11.  
  12.  
  13.     PAGE    60, 132
  14. TITLE    XonXoff    30-Sep-85    XON/XOFF Printer Interface        |
  15.  
  16. ;-----------------------------------------------------------------------|
  17. ;                                    |
  18. ;    XON/XOFF Printer Interface                    |
  19. ;        Installed as "terminate and stay resident" program    |
  20. ;                                    |
  21. ;-----------------------------------------------------------------------|
  22. ;    REVISION HISTORY                        |
  23. ;                                    |
  24. ; Number    DD-MMM-YY             WHO                     WHY        |
  25. ;-------|---------------|-----------------------|-----------------------|
  26. ; 0.0    |   30-Sep-85    | Frank Whaley        | Initial Release    |
  27. ;-----------------------------------------------------------------------|
  28.  
  29. IERport    EQU    03F9H            ; Interrupt Enable Register
  30. LSRport    EQU    03FDH            ; Line Status Register
  31. MCRport    EQU    03FCH            ; Modem Control Register
  32. MSRport    EQU    03FEH            ; Modem Status Register
  33. RBRport    EQU    03F8H            ; Receiver Buffer Register
  34. THRport EQU    RBRport            ; Transmit Holding Register
  35. Imask    EQU    0EFH            ; interrupt enable mask
  36. IIRport    EQU    03FAH            ; Interrupt Identification Register
  37.  
  38. BrkInt    EQU    6            ; break interrupt
  39. EOI    EQU    20H            ; End Of Interrupt
  40. InpInt    EQU    4            ; input interrupt
  41. INTA00    EQU    20H
  42. INTA01    EQU    21H
  43. THRE    EQU    20H            ; Transmit Holding Register Empty
  44.  
  45. XOFF    EQU    'S' - 40H
  46. XON    EQU    'Q' - 40H
  47.  
  48. ;-----------------------------------------------------------------------|
  49. ;    The Usual Stuff                            |
  50. ;-----------------------------------------------------------------------|
  51.  
  52. cGroup    Group    Code
  53.  
  54. Code    Segment Public 'Code'
  55.  
  56.     Assume    CS:Code, DS:Code, ES:Code, SS:Code
  57.  
  58.     Org    100H
  59.  
  60. XonXoff:
  61.     JMP    Install            ; install traps
  62.  
  63. Ready    DB    80H            ; ready flag
  64.  
  65.     PAGE
  66. ;-----------------------------------------------------------------------|
  67. ;    Printer interrupt handler                    |
  68. ;                                    |
  69. ;    ENTRY :    as for printer interrupt (INT 17H)            |
  70. ;                                    |
  71. ;    EXIT :    ditto                            |
  72. ;                                    |
  73. ;-----------------------------------------------------------------------|
  74.  
  75. Handler    Proc    Far
  76.  
  77.     TEST    AH,AH            ; output request ??
  78.     JNZ    Hand3            ; if NZ: return status
  79.  
  80.     STI
  81.  
  82. Hand1:
  83.     TEST    CS:Ready,0FFH        ; ready ??
  84.     JZ    Hand1            ; wait until ready
  85.  
  86.     CLI
  87.     PUSH    BX            ; (+1) save
  88.     PUSH    DX            ; (+2)
  89.     MOV    BL,AL            ; save char
  90.     MOV    DX,LSRport
  91.  
  92. Hand2:
  93.     IN    AL,DX            ; get line status
  94.     TEST    AL,THRE            ; transmit holding register empty ??
  95.     JZ    Hand2            ; if Z: uart not ready yet, loop
  96.  
  97.     MOV    AL,BL
  98.     MOV    DX,THRport        ; transmit port
  99.     OUT    DX,AL            ; transmit
  100.  
  101.     POP    DX            ; (+1) restore
  102.     POP    BX            ; (+0)
  103.  
  104. Hand3:
  105.     MOV    AH,CS:Ready
  106.     OR    AH,10H            ; always selected
  107.     IRET
  108.  
  109. Handler    EndP
  110.  
  111.     PAGE
  112. ;-----------------------------------------------------------------------|
  113. ;    Serial interrupt server                        |
  114. ;                                    |
  115. ;    ENTRY :    as from serial interrupt                |
  116. ;                                    |
  117. ;    EXIT :    all registers preserved                    |
  118. ;                                    |
  119. ;-----------------------------------------------------------------------|
  120.  
  121. Server    Proc    Far
  122.  
  123.     PUSH    DX            ; (+1) all what i use
  124.     PUSH    AX            ; (+2)
  125.  
  126.     MOV    DX,IIRport
  127.     IN    AL,DX
  128.     AND    AL,0FEH            ; skip interrupt pending
  129.     TEST    AL,AL            ; modem status ??
  130.     JZ    Serv2            ; if Z: read MSR
  131.  
  132.     CMP    AL,BrkInt        ; break ??
  133.     JE    Serv3            ; if E: just clear interrupt
  134.  
  135.     CMP    AL,InpInt        ; input data received ??
  136.     JE    Serv4            ; if E: get and queue input
  137.  
  138. Serv1:
  139.     MOV    AL,EOI            ; signal end-of-interrupt
  140.     OUT    INTA00,AL
  141.  
  142.     POP    AX            ; (+1) restore
  143.     POP    DX            ; (+0)
  144.     IRET
  145.  
  146. Serv2:                    ; read MSR
  147.     MOV    DX,MSRport        ; just read port to clear interrupt
  148.     IN    AL,DX
  149.     JMP    SHORT Serv1
  150.  
  151. Serv3:                    ; break received
  152.     MOV    DX,LSRport
  153.     IN    AL,DX
  154.     JMP    SHORT Serv1
  155.  
  156. Serv4:                    ; look for XON/XOFF
  157.     MOV    DX,RBRport
  158.     IN    AL,DX            ; AL = input
  159.     AND    AL,7FH
  160.     XOR    AH,AH            ; assume not ready
  161.     CMP    AL,XOFF
  162.     JE    Serv5            ; if E: not ready
  163.  
  164.     MOV    AH,80H            ; assume ready
  165.     CMP    AL,XON
  166.     JE    Serv5            ; if E: is ready
  167.  
  168.     JMP    SHORT Serv1        ; otherwise no change
  169.  
  170. Serv5:
  171.     MOV    CS:Ready,AH        ; set flag
  172.     JMP    SHORT Serv1
  173.  
  174. Server    EndP
  175.  
  176.     PAGE
  177. ;-----------------------------------------------------------------------|
  178. ;    XON/XOFF Printer Interface                    |
  179. ;                                    |
  180. ;    ENTRY :    normal COM program entry                |
  181. ;                                    |
  182. ;    EXIT :    Terminate / Stay Resident                |
  183. ;                                    |
  184. ;-----------------------------------------------------------------------|
  185.  
  186. Install    Proc    Near
  187.  
  188.     MOV    DX,Offset Handler    ; first take over INT 17 vector
  189.     MOV    AX,2517H
  190.     INT    21H
  191.  
  192.     MOV    DX,Offset Server    ; now COM1 vector
  193.     MOV    AX,250CH
  194.     INT    21H
  195.  
  196.     CLI
  197.     MOV    DX,MCRport        ; get status of MCR
  198.     IN    AL,DX
  199.     OR    AL,0FH            ; set DTR, RTS, OUT1, OUT2
  200.     OUT    DX,AL            ; init MCR
  201.  
  202.     MOV    DX,LSRport        ; clear pending status
  203.     IN    AL,DX
  204.     MOV    DX,RBRport
  205.     IN    AL,DX
  206.     MOV    DX,IIRport
  207.     IN    AL,DX
  208.     MOV    DX,MSRport
  209.     IN    AL,DX
  210.  
  211.     IN    AL,INTA01
  212.     AND    AL,Imask
  213.     OUT    INTA01,AL
  214.  
  215.     MOV    AL,1            ; select Data Available interrupt
  216.     MOV    DX,IERport
  217.     OUT    DX,AL
  218.     STI
  219.  
  220.     MOV    DX,Offset Install    ; DS:DX -> end of "keep" area
  221.     INT    27H            ; terminate / stay resident
  222.  
  223. Install    EndP
  224.  
  225. Code    EndS
  226.  
  227.     END    XonXoff            ; of XonXoff.asm
  228.